import sys
import pandas as pd
import pymc as pm
import numpy as np
from collections import Counter

# 读取数据
data = pd.read_csv(  sys.argv[1]+'.csv')

# 提取特征和目标，加入 missCounts 和 sumCount
features = ['size', 'oddEven', 'sumSize', 'sumOddEven', 'combined', 'tailSize', 'animal', '12Animal', 'color', 'missCounts', 'sumCount']
X = pd.get_dummies(data[features])  # 将分类变量进行one-hot编码
y = data['code']  # 预测的目标是特码 code

# 转换为数值类型
X = X.astype(float)

# 保留列名
X_values = X.values  # 转换为数组格式，但保留 X 以获取列名

# 贝叶斯推断模型
with pm.Model() as model:
    # 定义先验分布
    beta = pm.Normal('beta', mu=0, sigma=1, size=X.shape[1])
    alpha = pm.Normal('alpha', mu=0, sigma=1)
    
    # 线性回归模型
    mu = alpha + pm.math.dot(X_values, beta)
    
    # 使用离散分布来表示六合彩号码 (假设号码范围为1到49)
    y_obs = pm.DiscreteUniform('y_obs', lower=1, upper=49, observed=y)
    
    # 使用NUTS抽样方法进行MCMC采样
    trace = pm.sample(2000, return_inferencedata=True)

# 使用最新一期数据进行预测
new_data = data.iloc[0:1]  # 获取最新一期数据，即第一行

# 将新数据进行one-hot编码
new_data_encoded = pd.get_dummies(new_data[features])
new_data_encoded = new_data_encoded.reindex(columns=X.columns, fill_value=0)

# 转换新数据的类型
new_data_encoded = new_data_encoded.astype(float)

# 使用贝叶斯推断的样本进行预测
with model:
    posterior_predictive = pm.sample_posterior_predictive(trace)

# 打印预测的后验预测数据
print("预测的后验预测数据：", posterior_predictive)

# 获取后验预测数据中的 'y_obs' 部分
predicted_codes = posterior_predictive.posterior_predictive['y_obs'].values

# 将所有预测结果展平为一维数组
flattened_codes = predicted_codes.flatten()

# 统计每个号码的出现频率
frequency = Counter(flattened_codes)

# 找到出现频率最高的 24 个号码
most_common_codes = frequency.most_common(24)

# 提取出号码
top_24_codes = [code for code, count in most_common_codes]

# 对号码进行从小到大的排序
sorted_top_24_codes = sorted(top_24_codes)

print("预测的最有可能的 24 个 code 值：", sorted_top_24_codes)
